/**
 * @author: Pablo Weremczuk */
 import SCUMMCore.Vector;
 
class SCUMMCore.CommonFunctions{
			/**
			 * Esta funcion orienta el movieclip mc del punto p0 a p1			 */
			static function orientateMovieClip(p0, p1, mc:MovieClip, blMaintainSize:Boolean){
					var equiv_angulo = 180/Math.PI;
					var cat_opuesto = p1._y-p0._y; 
					var cat_ady=p1._x-p0._x;
					if (!blMaintainSize) {
						mc._rotation = 0;
						mc._width = distancia(p0, p1);
					}
					mc._x = p0._x;
					mc._y = p0._y;
					mc._rotation = Math.atan2(cat_opuesto,cat_ady)*equiv_angulo;
			}
			/**
			 * Dado un punto que se pasa como parametro, dibuja el mismo en las coordenadas _x e _y las cuales deven ser parametros del objeto			 */
			static function drawParticles(p) {
				_root.createEmptyMovieClip("particleClip", 100000);
				with (_root.particleClip) {
					clear();
					lineStyle(7, 0x000000, 100);
					for (var i = 0; i<p.length; i++) {
						moveTo(p[i]._x, p[i]._y);
						lineTo(p[i]._x+0.5, p[i]._y+0.5);
					}
				}
			}
			/**
			 * SPA: Esta funcion dibuja los contrains de lo nodos entre el grafo.
			 * EN: This function draws the contrains between the nodes in the graph.
			 * 			 */
			static function drawConstrain(p0, p1, blClear:Boolean) {
				_root.createEmptyMovieClip("particleClip", 100000);
				with(_root.particleClip) {
					if(blClear)clear();
					lineStyle(7, 0x000000, 100);
					moveTo(p0._x, p0._y);
					lineTo(p1._x, p1._y);
				}
			}
			/**
			 * SPA: Esta función hace que el movieclip que se le pasa como parametro siga el mouse con easing.
			 * EN: This function makes the movieclip tha pases it as parameter follows the mopuse using easing.			 */
			static function followMouse(p) {
				p._x -= (p._x-_root._xmouse)/3;
				p._y -= (p._y-_root._ymouse)/3;
			}
			/**
			 * SPA: Esta funcion hace que dos particulas que son pasadas como parametro esten a la distancia de "largo", tambien pasada como parametro.
			 * EN: This function makes both movieclips passed as parameters be at exactly "largo" distance.			 */
			static function constrain(p0, p1, largo) {
				var correction = 0.00025;
				var dx = p1._x-p0._x;
				var dy = p1._y-p0._y;
				var d = new Vector(dx, dy);
				var r = (d.length-largo)/d.length;
				var x = d.x*0.500000*r;
				var y = d.y*0.500000*r;
				if (!p1._masaInfinita) {
					p1._x = p1._x-(x-correction);
					p1._y = p1._y-y;
				}
				if (!p0._masaInfinita) {
					p0._x = p0._x+(x+correction);
					p0._y = p0._y+y;
				}
			}
			/**
			 * SPA: Este contrains permite que las particulas p1, y p2 pasadas como parametro se encuentren a una distacia no menor a Largo en cada momento.
			 * EN: This type of contrain allows that every particle passed as param be in every moment in a fixed distance never lower than Largo.			 */
	
			static function constrainRepeler(p0, p1, largo) {
				var correction = 0.00025;
				var dx = p1._x-p0._x;
				var dy = p1._y-p0._y;
				var d = new Vector(dx, dy);
				var r = (d.length-largo)/d.length;
				var x = d.x*0.500000*r;
				var y = d.y*0.500000*r;
				if(largo>distancia(p0,p1)){
					if (!p1._masaInfinita) {
						p1._x = p1._x-(x-correction);
						p1._y = p1._y-y;
					}
					if (!p0._masaInfinita) {
						p0._x = p0._x+(x+correction);
						p0._y = p0._y+y;
					}
				}
			}

			
			/**
			 * SPA: Devuelve la distancia euleriana entre los p0 y p1.
			 * EN: Returns the euler distance between p0 and p1.			 */
			static function distancia(p0, p1) {
				return Math.sqrt((p0._x-p1._x)*(p0._x-p1._x)+(p0._y-p1._y)*(p0._y-p1._y));
			}

}